#include "filtroVentanaNuevo.h"

FiltroVentanaNuevo::FiltroVentanaNuevo(QWidget *parent)
	: QDialog(parent)
{
	ui.setupUi(this);
}

FiltroVentanaNuevo::~FiltroVentanaNuevo(){

}

void FiltroVentanaNuevo::actualizar(QStandardItemModel & m1, QStandardItemModel& m2){
	switch(tabIndex()){
	case 0:
		vacio(m1, m2);
		break;

	case 1:
		//Media
		media(m1, m2);
		break;

	case 2:
		//Gaussiano
		gaussiano(m1, m2);
		break;
	}
}

void FiltroVentanaNuevo::vacio(QStandardItemModel& model1, QStandardItemModel& model2){
	separable = ui.vacioSeparable->isChecked();
	row = ui.vacioF->value();
	col = ui.vacioC->value();
	factorf = 1;
	factorc = 1;
	if(separable){
		model1.setRowCount(row);
		model1.setColumnCount(1);
		model2.setRowCount(1);
		model2.setColumnCount(col);
	}else{
		model1.setRowCount(row);
		model1.setColumnCount(col);
	}
}

void FiltroVentanaNuevo::media(QStandardItemModel& model1, QStandardItemModel& model2){
	//¿Es separable el de la media? en la práctica no dice nada
	separable = ui.mediaSeparable->isChecked();
	row = ui.mediaF->value();
	col = ui.mediaC->value();

	if(separable){
		model1.setRowCount(row);
		model1.setColumnCount(1);
		model2.setRowCount(1);
		model2.setColumnCount(col);
		factorf = row;
		factorc = col;
		for(int i = 0; i < row; i++){
			QModelIndex index = model1.index(i, 0, QModelIndex());
			model1.setData(index, QVariant(1));
		}
		for(int j = 0; j < col; j++){
			QModelIndex index = model2.index(0, j, QModelIndex());
			model2.setData(index, QVariant(1));
		}
	}else{
		model1.setRowCount(row);
		model1.setColumnCount(col);
		factorf = row * col;
		factorc = 1;
		for(int i = 0; i < row; i++){
			for(int j = 0; j < col; j++){
				QModelIndex index = model1.index(i, j, QModelIndex());
				model1.setData(index, QVariant(1));
			}
		}
	}
}
void FiltroVentanaNuevo::gaussiano(QStandardItemModel& model1, QStandardItemModel& model2){
	separable = true;
	double sigma = ui.dtipica->value();

	//Calculamos el tamaño del vector
	int w = qFloor(7.4 * sigma);
	if(w % 2 != 1){
		w += 1; //Si es par lo ajustamos a un tamaño impar
	}

	row = w;
	col = w;
	model1.setRowCount(w);
	model1.setColumnCount(1);
	model2.setRowCount(1);
	model2.setColumnCount(w);

	int centro = (w - 1) / 2;
	double sigma2 = 2 * sigma * sigma;

	//Ponemos el peso del centro

	QModelIndex index = model1.index(centro, 0, QModelIndex());
	model1.setData(index, QVariant(1000));

	index = model2.index(0, centro, QModelIndex());
	model2.setData(index, QVariant(1000));
	int total = 1000;

	for(int i = centro + 1; i < w; i++){
		int x = centro - i;
		int peso = qRound(1000 * exp(-(x*x)/(sigma2)));
		QVariant dato(peso); //Peso
		total += 2*peso; //Sumamos el peso

		//Modelo 1
		QModelIndex index = model1.index(i, 0, QModelIndex());
		model1.setData(index, QVariant(peso));
		index = model1.index(2*centro - i, 0, QModelIndex());
		model1.setData(index, QVariant(peso));

		//Modelo 2
		index = model2.index(0, i, QModelIndex());
		model2.setData(index, QVariant(peso));
		index = model2.index(0, 2*centro - i, QModelIndex());
		model2.setData(index, QVariant(peso));
	}

	//Facoteres de normalización
	factorf = total;
	factorc = total;
}
